[ ] پایه و اساس شرطها در Bash هستند و در آزمونهای LPIC و RHCSA بسیار پرتکرارند.
فرض کن یه دوربین مداربسته داری که مدام چک میکنه که آیا کسی جلوی درب هست یا نه. توی لینوکس، دستور test دقیقاً همینه: به اسکریپت شما اجازه میده شرایط مختلف رو بررسی کنه و بر اساس اون تصمیم بگیره. این جلسه بهت یاد میده چطور با test و [ ] فایلها، دایرکتوریها، اعداد و رشتهها رو بررسی کنی!
test چیست؟
test یک دستور داخلی در Bash است که برای بررسی شرایط و مقایسهها استفاده میشود. این دستور خروجی مستقیم نمایش نمیدهد، بلکه یک کد خروجی (Exit Status) برمیگرداند:
[ ] در Bash، در واقع همان دستور test است که به صورت زیباتر نوشته شده است. [ condition ] معادل test condition است.
[ ] و test هر دو یک کار را انجام میدهند. در اسکریپتنویسی، معمولاً از [ ] استفاده میشود.
test
دستور test سه دسته اصلی بررسی انجام میدهد:
-e)-d)-r)-w)-x)-s)-eq)-gt)-lt)-ge)-le)-ne)=)!=)-z)-n)| گزینه | معنی | مثال |
|---|---|---|
-e |
آیا فایل/دایرکتوری وجود دارد؟ | test -e file.txt |
-d |
آیا دایرکتوری وجود دارد؟ | test -d /home |
-f |
آیا فایل معمولی وجود دارد؟ | test -f script.sh |
-r |
آیا فایل قابل خواندن است؟ | test -r file.txt |
-w |
آیا فایل قابل نوشتن است؟ | test -w file.txt |
-x |
آیا فایل قابل اجرا است؟ | test -x script.sh |
-s |
آیا فایل وجود دارد و خالی نیست؟ | test -s file.txt |
توضیح: test -e mabedini بررسی میکند که آیا فایل mabedini وجود دارد یا نه. چون وجود دارد، $? برابر ۰ است و && پیام را چاپ میکند.
توضیح: ابتدا فایل mabedini قابل اجرا نیست، پس شرط test -x false برمیگرداند. بعد از chmod +x، شرط true میشود و پیام چاپ میشود.
test -x بررسی میکند که آیا فایل قابل اجرا است یا نه. این برای اسکریپتها بسیار مهم است.
با test میتوانید بررسی کنید که کدام فایل جدیدتر (newer) یا قدیمیتر (older) است.
| گزینه | معنی | مثال |
|---|---|---|
file1 -nt file2 |
آیا file1 جدیدتر از file2 است؟ | test file1 -nt file2 |
file1 -ot file2 |
آیا file1 قدیمیتر از file2 است؟ | test file1 -ot file2 |
توضیح: -nt مخفف Newer Than و -ot مخفف Older Than است.
test| گزینه | معنی | مثال |
|---|---|---|
num1 -eq num2 |
برابر (Equal) | [ 5 -eq 5 ] → True |
num1 -ne num2 |
نابرابر (Not Equal) | [ 5 -ne 3 ] → True |
num1 -gt num2 |
بزرگتر (Greater Than) | [ 5 -gt 3 ] → True |
num1 -lt num2 |
کوچکتر (Less Than) | [ 5 -lt 3 ] → False |
num1 -ge num2 |
بزرگتر یا مساوی (Greater or Equal) | [ 5 -ge 5 ] → True |
num1 -le num2 |
کوچکتر یا مساوی (Less or Equal) | [ 5 -le 5 ] → True |
توضیح: && در صورت True اجرا میشود و || در صورت False.
-eq، -gt استفاده میشود، نه از = و > که برای رشتهها هستند.
| گزینه | معنی | مثال |
|---|---|---|
str1 = str2 |
برابر | [ "ali" = "ali" ] → True |
str1 != str2 |
نابرابر | [ "ali" != "reza" ] → True |
-z str |
رشته خالی است | [ -z "" ] → True |
-n str |
رشته غیرخالی است | [ -n "hello" ] → True |
[ ] در اسکریپتtest و [ ] معادل هم هستند و برای بررسی شرایط استفاده میشوند.-e (وجود)، -d (دایرکتوری)، -f (فایل معمولی)، -r (خواندنی)، -w (نوشتنی)، -x (اجرایی)، -s (غیرخالی).-eq (برابر)، -ne (نابرابر)، -gt (بزرگتر)، -lt (کوچکتر)، -ge (بزرگتر یا مساوی)، -le (کوچکتر یا مساوی).= (برابر)، != (نابرابر)، -z (خالی)، -n (غیرخالی).-nt (جدیدتر) و -ot (قدیمیتر).[ ] حتماً بین براکت و شرط فاصله بگذارید.یک اسکریپت بنویسید که:
read از کاربر یک نام فایل بگیرد.[ -e ] بررسی کند که آیا فایل وجود دارد یا نه.[ -r ]، [ -w ] و [ -x ] مجوزهای آن را بررسی کند و به کاربر گزارش دهد.